﻿//*************************************************************************
//面向服务的协作式智能交通系统仿真软件SoC-ITSS v2.1 alpha
//发布单位：西北工业大学--巴黎高科MINES机器人与群智能系统联合实验室
//团队负责人：张凯龙 Zhang Kailong
//团队成员：张大方、杨安胜、王敏、谢策、王雨佳、谢尘玉等
//联系我们：kl.zhang@nwpu.edu.cn
//2012-2021
//*************************************************************************

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CyberCarSimulation.Bean;
//*******************************************************
//
//文件名(File Name):           ModelHandle.cs
//
//数据表(Tables):              nothing 
//
//          修改理由：         完善属性
//

//*******************************************************

namespace CyberCarSimulation.RoadModel
{
    class ModelHandle
    {

        public ModelHandle() 
        {
        }
        
        //对模型中道路、路口等数据处理,方便仿真时数据使用
        public static void DataHandle()
        {
            LaneHandle();
            IntersectionHandle();
            EntLeaIntHandle();
        }


        //将车道分类成为进入车道， 离开车道，中间车道
        public static void LaneHandle()
        {
            MainData.TotalLaneList = new List<Lane>();  //初始化全部车道
            MainData.EnterLaneList = new List<Lane>();  //初始化进入车道
            MainData.LeaveLaneList = new List<Lane>();  //初始化离开车道
            MainData.CenterLaneList = new List<Lane>(); //初始化中间车道

            List<Way> WayList = MainData.TotalWayList;

            foreach(Way w in WayList)
            {
                List<Lane> LaneList = w.GetLaneList();
                bool WayTypeFlag = false;

                foreach(Lane l in LaneList)              //遍历车道Lane将Lane放入对应的List中
                {
                    if ("Enter".Equals(l.GetLType()))
                    {
                        MainData.EnterLaneList.Add(l);
                        MainData.TotalLaneList.Add(l);   //所有的车道集合
                    }

                    if ("Leave".Equals(l.GetLType()))
                    {
                        MainData.LeaveLaneList.Add(l);
                        MainData.TotalLaneList.Add(l);
                    }

                    if ("Center".Equals(l.GetLType()))
                    {
                        MainData.CenterLaneList.Add(l);
                        MainData.TotalLaneList.Add(l);
                        WayTypeFlag = true;
                    }
                }


                //将way加入队列
                if (WayTypeFlag == true)
                {
                    MainData.CenterWayList.Add(w);
                }

            }

        }



        //将路口分类成为进出路口，中间路口
        public static void IntersectionHandle()
        {
            MainData.TotalIntersectionList = new List<Intersection>();
            MainData.SEIntersectionList = new List<Intersection>();
            MainData.CEIntersectionList = new List<Intersection>();


            List<Intersection> IntersectionList = MainData.Map.GetIntersectionList();
            foreach (Intersection i in IntersectionList)  //遍历Intersection放入对应的
            {
                if ("SE".Equals(i.GetIType()))
                {
                    MainData.SEIntersectionList.Add(i);
                    MainData.TotalIntersectionList.Add(i);
                }

                if ("CE".Equals(i.GetIType()))
                {
                    MainData.CEIntersectionList.Add(i);
                    MainData.TotalIntersectionList.Add(i);
                }
            }
        }

        //统计进入离开该路口的车道
        public static void EntLeaIntHandle()
        {
            MainData.TotalCriticalList = new List<Critical>();

            //将所有的临界区放入集合TotalCriticalList
            foreach (Intersection i in MainData.CEIntersectionList)
            {
                MainData.TotalCriticalList.AddRange(i.GetCriticalList());

            }
                        
            //遍历所有的车道，将车道放入对应的路口中
            foreach (Lane l in MainData.TotalLaneList)
            {

                foreach(Intersection i in MainData.CEIntersectionList)
                {
                    foreach(Critical c in i.GetCriticalList())        //开始于这个临界区，就是离开这个路口
                    {
                        if (c.GetID().Equals(l.GetStartCriticalID()))
                        {
                            List<Lane> LeaveTemp = i.GetLeaveIntLaneList();
                            LeaveTemp.Add(l);
                            i.SetLeaveIntList(LeaveTemp);           //将新的List写入路口的属性中

                            l.SetLeaveCEIntID(i.GetID());           //设置离开的路口                                                               
                        }

                        if (c.GetID().Equals(l.GetEndCriticalID()))  //终止于该临界区，就是进入这个路口
                        {
                            List<Lane> LeaveTemp = i.GetEnterIntLaneList();
                            LeaveTemp.Add(l);
                            i.SetEnterIntLaneList(LeaveTemp);           //将新的List写入
                          
                            l.SetEnterCEIntID(i.GetID());           //设置进入出的路口
                        }
                    }
                    
                }
            }

        }



        //计算每条车道的刹车线、进入线、停止线
        //public 





    }
}
